Nous avons choisi d'implémenter le client en JAVA. En effet ce choix nous a
paru plus judicieux vis à vis des bibliothèques avancées apportées par JAVA
et des fonctionnalités plus complexes du client.

\section{Les échanges avec le Tracker}

Dans la version centralisée le client n'a aucune information sur le réseau
tant qu'il n'est pas connecté au tracker. Le client doit donc dans un
premier temps s'annoncer au Tracker. Pour cela l'utilisateur doit fournir
au logiciel l'adresse IP du Tracker, ainsi que le port que l'utilisateur
souhaite utiliser. Une fois ces informations entrées le client se connecte
au Tracker et s'annonce en lui fournissant le port sur lequel il échangera
les informations avec le tracker, ainsi que deux listes~: la liste des
fichiers pour lesquels il est ``seeder'' et celle des fichiers pour
lesquels il est ``leecher''.

Le client a ensuite quatre actions à disposition~:
     \begin{itemize}
        \item envoyer une requête pour connaître les fichiers disponibles
sur le réseau à la demande de l'utilisateur,
        \item envoyer toutes les trois secondes (ce paramètre est réglable
dans le fichier de configuration) une mise à jour sur l'état de ses
fichiers,
        \item demander au Tracker la liste des pairs possédant les fichiers
qu'il ne possède que partiellement, mais il peut aussi chercher des
fichiers disponibles sur le réseau,
        \item écouter les  réponses du Tracker.
     \end{itemize}

La communication avec le Tracker est gérée dans le programme principal.
Lorsque celui-ci reçoit les informations du Tracker, il les stocke et
exécute des threads pour réaliser les échanges avec les autres pairs.

\section{Les échanges avec les autres pairs}

Lorsque certains fichiers ne sont pas complets, le serveur doit se
connecter à d'autres pairs afin de télécharger les pièces manquantes. Le
Tracker nous fournit l'adresse IP du pair, ainsi que le port d'écoute. Le
programme principal lance un thread qui gèrera la communication avec les
pairs. Les échanges peuvent avoir lieu avec plusieurs pairs pour le même
fichier, dans ce cas plusieurs threads sont exécutés.

Le rôle de ce thread est de~:
        \begin{itemize}
            \item  créer un socket entre les deux pairs,
            \item  dialoguer avec les autres pairs afin de savoir quelles
sont les parties que nous n'avons pas mais que l'autre pair possède,
            \item  télécharger les pièces les écrivant au bon endroit au
sein du fichier.
        \end{itemize}

\section{La gestion des fichiers}

L'arborescence de notre projet possède deux dossiers particuliers~:
    \begin{itemize}
      \item ``seed''~: ce dossier contient tous les fichiers complets,
      \item ``leech''~: ce dossier contient tous les fichiers incomplets en
cours de téléchargement, une fois le téléchargement terminé le fichier est
déplacé dans le dossier ``seed''.
    \end{itemize}

Nous annonçons au Tracker l'ensemble des fichiers présents dans ces
répertoires, en différenciant les fichiers pour lesquels nous sommes
leecher de ceux pour lesquels nous sommes seeder. Pour générer la clé nous
chiffrons le fichier en md5, ce qui nous permet de s'assurer que chaque
fichier a une clef unique. Pour chaque fichier nous instancions un objet
FileData qui contient de nombreuses informations comme la taille, le nom,
la liste des seeders...

Le BufferMap permet de gérer toutes les informations sur les pièces que
nous possédons dans un fichier. Il est représenté sous forme de séquence de
bits dont le nombre correspond au nombre total de pièces du fichier. Ainsi
chaque bit nous informe de la présence de la pièce dans le fichier.

\section{Améliorations à apporter}

Si nous avions eu plus de temps, nous aurions pu apporter quelques
améliorations~:
    \begin{itemize}
        \item optimiser la vitesse de téléchargement
        \item ajouter un algorithme de sélection des pièces disponibles en fonction de la rareté
    \end{itemize}

\section{Diagrammes}
	\begin{figure}[h!]
	   \caption{\label{diagramme} Diagramme de Séquence}
	   \includegraphics[width=16cm]{pictures/diagsequence.png}
	\end{figure}


	\begin{figure}[h!]
	   \caption{\label{diagrammeclient} Diagramme de Classe du Client Java}
	   \includegraphics[width=16cm]{pictures/classes.png}
	\end{figure}
